package com.graduation.springbootinit.controller;

import com.graduation.springbootinit.common.BaseResponse;
import com.graduation.springbootinit.common.ErrorCode;
import com.graduation.springbootinit.common.ResultUtils;
import com.graduation.springbootinit.exception.BusinessException;
import com.graduation.springbootinit.manager.CosManager;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api/file")
public class CosController {

    @Resource
    private CosManager cosManager;

    /**
     * 文件上传
     *
     * @param file 文件
     * @return 文件访问地址
     */
    @PostMapping("/upload")
    public BaseResponse<String> uploadFile(@RequestPart("file") MultipartFile file) {
        try {
            // 文件大小校验（这里限制为10MB）
            long size = file.getSize();
            if (size > 10 * 1024 * 1024) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件大小不能超过10MB");
            }
            // 文件后缀校验
            String fileName = file.getOriginalFilename();
            String suffix = fileName.substring(fileName.lastIndexOf("."));
            if (!".jpg".equalsIgnoreCase(suffix) && !".jpeg".equalsIgnoreCase(suffix)
                    && !".png".equalsIgnoreCase(suffix) && !".gif".equalsIgnoreCase(suffix)) {
                throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件类型错误");
            }
            // 生成随机文件名
            String randomFileName = RandomStringUtils.randomAlphanumeric(8) + suffix;
            // 创建临时文件
            File tempFile = File.createTempFile(randomFileName, suffix);
            file.transferTo(tempFile);
            // 上传文件
            cosManager.putObject(randomFileName, tempFile);
            // 返回可访问地址
            return ResultUtils.success("https://" + cosManager.getCosClientConfig().getBucket() + ".cos." 
                    + cosManager.getCosClientConfig().getRegion() + ".myqcloud.com/" + randomFileName);
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文件上传失败");
        }
    }

    /**
     * 批量文件上传
     *
     * @param files 文件列表
     * @return 文件访问地址列表
     */
    @PostMapping("/upload/batch")
    public BaseResponse<List<String>> uploadFiles(@RequestPart("files") List<MultipartFile> files) {
        List<String> urls = new ArrayList<>();
        for (MultipartFile file : files) {
            try {
                // 文件大小校验（这里限制为10MB）
                long size = file.getSize();
                if (size > 10 * 1024 * 1024) {
                    throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件大小不能超过10MB");
                }
                // 文件后缀校验
                String fileName = file.getOriginalFilename();
                String suffix = fileName.substring(fileName.lastIndexOf("."));
                if (!".jpg".equalsIgnoreCase(suffix) && !".jpeg".equalsIgnoreCase(suffix)
                        && !".png".equalsIgnoreCase(suffix) && !".gif".equalsIgnoreCase(suffix)) {
                    throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件类型错误");
                }
                // 生成随机文件名
                String randomFileName = RandomStringUtils.randomAlphanumeric(8) + suffix;
                // 创建临时文件
                File tempFile = File.createTempFile(randomFileName, suffix);
                file.transferTo(tempFile);
                // 上传文件
                cosManager.putObject(randomFileName, tempFile);
                // 添加可访问地址
                urls.add("https://" + cosManager.getCosClientConfig().getBucket() + ".cos." 
                        + cosManager.getCosClientConfig().getRegion() + ".myqcloud.com/" + randomFileName);
            } catch (Exception e) {
                throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文件上传失败");
            }
        }
        return ResultUtils.success(urls);
    }
}
